﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuanLyNganHangDe.BLL.WordConvertor
{
    public class TagOption
    {
        public string PhanCauHoi_Begin { get; set; }
        public string PhanCauHoi_End { get; set; }
        public string KhoiCauHoi_Begin { get; set; }
        public string KhoiCauHoi_End { get; set; }
        public string CauHoi_Begin { get; set; }
        public string CauHoi_End { get; set; }

        public string PhanDapAn_Begin { get; set; }
        public string PhanDapAn_End { get; set; }
        public string KhoiDapAn_Begin { get; set; }
        public string KhoiDapAn_End { get; set; }
        public string DapAn_Begin { get; set; }
        public string DapAn_End { get; set; }

        public static TagOption Default
        {
            get
            {
                return new TagOption()
                {
                    PhanCauHoi_Begin = "[lq_start]",
                    PhanCauHoi_End = "[lq_end]",
                    KhoiCauHoi_Begin = "[part_start]",
                    KhoiCauHoi_End = "[part_end]",
                    CauHoi_Begin = "[question_start]",
                    CauHoi_End = "[question_end]",
                    PhanDapAn_Begin = "[la_start]",
                    PhanDapAn_End = "[la_end]",
                    KhoiDapAn_Begin = "[part_ans_start]",
                    KhoiDapAn_End = "[part_ans_end]",
                    DapAn_Begin = "[anw_start]",
                    DapAn_End = "[anw_end]"
                };
            }
        }
    }

    public class Utils
    {
        public static void ExportTaggedDocumentOf(string stFilename, string stFilename2)
        {
            var stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start();            
            var option = TagOption.Default;
            string PHAN_DAP_AN = "II. PHẦN ĐÁP ÁN";
            using (var document = Novacode.DocX.Load(stFilename))
            {
                #region var lstParCauHoi = danh sách các par câu hỏi;
                var lstParCauHoi = new List<Novacode.Paragraph>();
                var idxEndOfCauHoiPar = -1;
                for (int i = 0; i < document.Paragraphs.Count; i++)
                {
                    var par = document.Paragraphs[i];
                    var parContent = par.Text.Trim().ToUpper();

                    if (parContent != PHAN_DAP_AN)
                    {
                        lstParCauHoi.Add(par);
                    }
                    else
                    {
                        idxEndOfCauHoiPar = i;
                        break;
                    }
                }
                #endregion

                #region var lstParDapAn = danh sách các par đáp án; bổ sung [lanw_start] ở đầu phần đáp án
                var lstParDapAn = new List<Novacode.Paragraph>();
                for (int i = idxEndOfCauHoiPar; i < document.Paragraphs.Count; i++)
                {
                    lstParDapAn.Add(document.Paragraphs[i]);
                }
                // Loại bỏ các đoạn rỗng (nếu có) ở phần cuối cùng
                var idxLast = lstParDapAn.Count - 1;
                while (true)
                {
                    var par = lstParDapAn[idxLast];
                    var parContent = par.Text.Trim();
                    if (parContent == "")
                    {
                        lstParDapAn.RemoveAt(idxLast);
                        idxLast = lstParDapAn.Count - 1;
                        if (idxLast < 0)
                            break;
                    }
                    else
                        break;
                }
                #endregion

                #region Bổ sung các thẻ cho các khối câu hỏi, câu hỏi
                var laKhoiCauHoiDauTien = true;
                var laCauHoiDauTienCuaKhoi = true;
                for (int i = 0; i < lstParCauHoi.Count; i++)
                {
                    var par = lstParCauHoi[i];
                    var text = par.Text;
                    if (text.StartsWith("Khối "))
                    {
                        #region Bắt đầu 1 khối..
                        laCauHoiDauTienCuaKhoi = true;
                        if (laKhoiCauHoiDauTien)
                        {
                            #region là khối câu hỏi đầu tiên => [lq_start]\[part_start]
                            par.InsertText(0, option.PhanCauHoi_Begin + "\r\n" + option.KhoiCauHoi_Begin);
                            laKhoiCauHoiDauTien = false;
                            #endregion
                        }
                        else
                        {
                            #region là khối câu hỏi thứ 2, 3, ... => [question_end][part_end]\[part_start]
                            par.InsertText(0, option.CauHoi_End + "\r\n" + option.KhoiCauHoi_End + "\r\n" + option.KhoiCauHoi_Begin);
                            #endregion
                        }
                        #endregion
                    }
                    else if (text.StartsWith("Câu "))
                    {
                        #region Bắt đầu 1 câu hỏi
                        if (laCauHoiDauTienCuaKhoi)
                        {
                            #region câu hỏi đầu tiên của khối => [question_start]
                            par.InsertText(0, option.CauHoi_Begin);
                            laCauHoiDauTienCuaKhoi = false;
                            #endregion
                        }
                        else
                        {
                            #region câu hỏi thứ 2, 3, ... của khối => [question_end]\[question_start]
                            par.InsertText(0, option.CauHoi_End + "\r\n" + option.CauHoi_Begin);
                            #endregion
                        }
                        #endregion
                    }
                }
                #endregion

                #region Đóng câu hỏi cuối cùng, đóng khối câu hỏi cuối cùng và đóng phần câu hỏi [question_end]\[part_end]\[lq_end]
                var lastQuestionPar = lstParCauHoi[lstParCauHoi.Count - 1];
                lastQuestionPar.AppendLine(option.CauHoi_End);
                lastQuestionPar.AppendLine(option.KhoiCauHoi_End);
                lastQuestionPar.AppendLine(option.PhanCauHoi_End);
                #endregion

                #region Bổ sung các thẻ cho các khối trả lời, câu trả lời
                var laDapAnDauTienCuaKhoi = true;
                var laKhoiDapAnDauTien = true;
                int soLuongDapAn = 0;
                for (int i = 0; i < lstParDapAn.Count; i++)
                {
                    var par = lstParDapAn[i];
                    var parcontent = par.Text.Trim().ToUpper();
                    if (parcontent == PHAN_DAP_AN)
                    {
                        #region Bắt đầu phần đáp án => Bổ sung [lanw_start] truước II. PHẦN ĐÁP ÁN
                        par.InsertText(0, option.PhanDapAn_Begin);
                        #endregion
                    }
                    else if (parcontent.StartsWith("KHỐI "))
                    {
                        laDapAnDauTienCuaKhoi = true;
                        #region Bắt đầu khối đáp án => bổ sung kết thúc đáp án ([anw_end]) cuối cùng của khối trước đó (nếu có)
                        if (!laKhoiDapAnDauTien)
                        {
                            var idxPrevAnswer = i - 3;
                            if (idxPrevAnswer >= 0 && soLuongDapAn > 0)
                            {
                                var parPrevAnswer = lstParDapAn[idxPrevAnswer];
                                parPrevAnswer.Append(option.DapAn_End);
                            }
                        }
                        laKhoiDapAnDauTien = false;
                        #endregion
                    }
                    else if (parcontent.StartsWith("CÂU "))
                    {
                        #region Bắt đầu 1 đáp án cho câu hỏi => [anw_start]
                        //try
                        {
                            //InsertTextBeforeFirstVisibleChar(ref par, option.DapAn_Begin);
                            //par.InsertText(0, option.DapAn_Begin); // gặp lỗi!!!
                            //par.ReplaceFirstText("Câu ", option.DapAn_Begin + "Câu ", false, System.Text.RegularExpressions.RegexOptions.None);
                            par.InsertTextBeforeFirstVisibleChar(option.DapAn_Begin);
                        }
                        //catch { }
                        #endregion

                        soLuongDapAn++;

                        if (!laDapAnDauTienCuaKhoi)
                        {
                            #region Không phải là đáp án đầu tiên => Thêm phần kết thúc đáp án [anw_end] của câu trước đó
                            var idxPrevParagraph = i - 1;
                            if (0 <= idxPrevParagraph && idxPrevParagraph <= lstParDapAn.Count - 1)
                            {
                                var prevPara = lstParDapAn[idxPrevParagraph];
                                prevPara.Append(option.DapAn_End);
                            }
                            #endregion
                        }
                        laDapAnDauTienCuaKhoi = false;
                    }
                }
                #endregion

                #region Đóng đáp án cuối cùng => [anw_end]
                // Ô tương ứng điểm số của đáp án cuối là par cách par cuối cùng 2 phần tử
                var idxLastAnswerPar = lstParDapAn.Count - 3;
                if (0 <= idxLastAnswerPar && idxLastAnswerPar <= lstParDapAn.Count - 1)
                {
                    var lastAnswerPar = lstParDapAn[idxLastAnswerPar];
                    lastAnswerPar.Append(option.DapAn_End);
                }
                #endregion

                #region Đóng phần đáp [lanw_end]
                document.Tables[document.Tables.Count - 1].InsertParagraphAfterSelf(option.PhanDapAn_End);
                #endregion

                document.SaveAs(stFilename2);
            }
            stopwatch.Stop();
            //var stMessage = string.Format("Đã thêm tag trong {0}ms", stopwatch.ElapsedMilliseconds);
            //MessageBox.Show(stMessage);
        }
    }
}
